// 导入axios
import axios from 'axios'
// 导入store
import store from '@/store'
// 导入Toast
import { Toast } from 'vant'
// 导入router
import router from '@/router'

// 创建一个新的请求对象，并设置基地址
const request = axios.create({
    baseURL: 'http://geek.itheima.net/'
})


// 请求拦截器
request.interceptors.request.use(config => {

    // 如果有token就帮你加token
    // 并且要满足本次请求没有 refresh 这个标记才加
    // 但凡有这个标记，就不加token了
    if (store.state.tokenObj.token && !config.refresh) {
        config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
    }
    return config
}, err => {

    return Promise.reject(err)
})


// 响应拦截器
request.interceptors.response.use(res => {
    // 单独把data返回出来
    return res.data
}, async err => {

    // 判断是否为401错误
    if (err.response.status === 401) {

        try {
            // 代表token有问题，那么就利用refresh_token去刷新得到新的token
            // 注意：这里千万不能直接用request对象发请求，因为他有请求拦截器，只要你用他发请求
            // 就会被拦截下来，然后加一个token就会替换掉我们自己的refresh_token
            // 怎么解决？
            // 要么不要用request这个对象发请求，那样就不会触发的请求拦截器，比如用axios发（但是要拼接基地址）
            const res = await request({
                url: '/v1_0/authorizations',
                method: 'put',
                headers: {
                    Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
                },
                // 用来标记本次请求是不是用来做刷新token的
                refresh: true
            })

            // 拿到新的token存到vuex和本地存储
            store.commit('setToken', {
                // 既保留了原本的refresh_token又把新的token存起来了
                token: res.data.token,
                refresh_token: store.state.tokenObj.refresh_token
            })

            // 把用户之前没拿到的数据请求再发一次，只不过是利用最新token发的
            // 这里为什么是用最新token发的，因为先把最新的token存到vuex里了
            // 然后用request发请求，就会触发request的请求拦截，触发请求拦截就会自动拿到vuex里最新的token
            // 加到请求头
            return request(err.config)
        } catch {
            // 能来到catch，只能证明连refresh_token都过期了，所以直接打回登录页即可
            // 先给个提示，登录状态已失效，请重新登录
            Toast.fail('登录状态已失效，请重新登录')
            // 因为跳转要用路由对象
            router.push({
                name: 'MyLogin',
                query: {
                    back: location.hash.substring(1)
                }
            })
           
        }
    } else {
        return Promise.reject(err)
    }
})

// 暴露出去
export default request